/*
 * To change this template, choose Tools | Templates and open the template in
 * the editor.
 */
package br.jm.acionista.filter;

import br.jm.acionista.base.eao.EaoException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import net.sf.trugger.element.Element;
import net.sf.trugger.element.Elements;
import static net.sf.trugger.scan.ClassScan.findClasses;

/**
 *
 * @author joao
 */
public class Configuracao {

    private Map<String, String> camposMap;
    private Map<String, String> camposMapType;
    public static HashMap<String, Map> tabelasMap;
    private Column annotation;
    private ConfiguraCampoAnnotation configuraCampo;
    private String nomeColuna;
    private String nomeEntidade;
    private String type;
    private String cNomMap;
    private String cNomMapType;
    private String cNomeTabela;
    private String nomeTabelaJoin;

    public Configuracao() {
    }

    public void gravaObjeto() throws EaoException {
        try {
            //ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("configuration.bin"));
            Set<Class> classes = findClasses().recursively().annotatedWith(Entity.class).in("br.jm.acionista.entity");
            Object[] nomeEntidades = classes.toArray();
            tabelasMap = new HashMap<String, Map>();

            for (int i = 0; i < nomeEntidades.length; i++) {
                Set<Element> columns = Elements.elements().annotatedWith(Column.class).in(nomeEntidades[i]);

                Set<Element> columnsConfigura = Elements.elements().annotatedWith(ConfiguraCampoAnnotation.class).in(nomeEntidades[i]);

                cNomMap = nomeEntidades[i].toString().replace("class br.jm.acionista.entity.", "");
                cNomMapType = cNomMap.concat("Type");

                camposMap = new HashMap<String, String>();
                camposMapType = new HashMap<String, String>();


                if (columnsConfigura.size() > 0) {
                    for (Element element : columnsConfigura) {
                        configuraCampo = element.getAnnotation(ConfiguraCampoAnnotation.class);

                        nomeTabelaJoin = configuraCampo.nomeTabelJoin();
                        nomeColuna = nomeTabelaJoin.concat(".").concat(configuraCampo.campo());
                        nomeEntidade = configuraCampo.pesquisa();
                        type = configuraCampo.tipo();

                        camposMap.put(nomeEntidade, nomeColuna);
                        camposMapType.put(nomeEntidade, type);
                    }
                }

                for (Element element : columns) {
                    annotation = element.getAnnotation(Column.class);

                    nomeColuna = annotation.name();
                    nomeEntidade = element.name();
                    type = element.type().toString();

                    if (!camposMap.containsKey(nomeEntidade)) {
                        camposMap.put(nomeEntidade, nomeColuna);
                        camposMapType.put(nomeEntidade, type);
                    }
                }

                camposMap.put(cNomMap, retornaSql(cNomMap));
                camposMap.put("Order", retornaOrder(cNomMap));


                tabelasMap.put(cNomMap, camposMap);
                tabelasMap.put(cNomMapType, camposMapType);
            }
        } catch (Exception e) {
            e.printStackTrace();
            //throw e;
        }

    }
    /*
     * public Map leObjeto(String cCampo) throws FileNotFoundException,
     * IOException { HashMap<String, Map> obj = null; try { ObjectInputStream in
     * = new ObjectInputStream(new FileInputStream("configuration.bin")); obj =
     * (HashMap<String, Map>) in.readObject(); camposMap = obj.get(cCampo);
     * in.close(); } catch (Exception e) { e.printStackTrace(); }
     *
     * return camposMap; }
     *
     * public Map leObjetoType(String cCampo) throws FileNotFoundException,
     * IOException { HashMap<String, Map> obj = null; try { ObjectInputStream in
     * = new ObjectInputStream(new FileInputStream("configuration.bin")); obj =
     * (HashMap<String, Map>) in.readObject(); camposMapType = obj.get(cCampo);
     * in.close(); } catch (Exception e) { e.printStackTrace(); }
     *
     * return camposMapType; }
     *
     *
     */

    private String retornaSql(String cTabela) {
        String cSql = null;

        if (cTabela.equals("CepEndereco")) {
            cSql = "with paginacao as ( "
                    + "SELECT row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "cep_endereco.cod_logradouro,cep_endereco.dsc_complemento,cep_endereco.dsc_logradouro,cep_endereco.num_cep, "
                    + "cep_bairro.cod_bairro,cep_bairro.dsc_bairro,cep_cidade.cod_cidade, "
                    + "cep_cidade.cep,cep_cidade.dsc_cidade,cep_uf.cod_uf, "
                    + "cep_uf.dsc_estado "
                    + "FROM cep_endereco, cep_bairro, cep_cidade, cep_uf "
                    + "WHERE cep_endereco.cod_bairro = cep_bairro.cod_bairro AND cep_bairro.cod_cidade = cep_cidade.cod_cidade "
                    + "AND cep_cidade.cod_uf = cep_uf.cod_uf ";
        } else if (cTabela.equals("CodigoDdd")) {
            cSql = "with paginacao as "
                    + "( select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "id_ddd,codigo,localidade,municipio,sigla,cep_uf.cod_uf "
                    + "FROM codigo_ddd , cep_uf "
                    + "where codigo_ddd.cod_uf = cep_uf.cod_uf ";
        } else if (cTabela.equals("CepBairro")) {
            cSql = "with paginacao as ( "
                    + "select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "cep_bairro.cod_bairro,cep_bairro.dsc_bairro,cep_cidade.cod_cidade, "
                    + "cep_cidade.cep,cep_cidade.dsc_cidade,cep_uf.cod_uf, "
                    + "cep_uf.dsc_estado "
                    + "FROM cep_bairro, cep_cidade, cep_uf "
                    + "WHERE cep_bairro.cod_cidade = cep_cidade.cod_cidade AND cep_cidade.cod_uf = cep_uf.cod_uf ";
        } else if (cTabela.equals("Moeda")) {
            cSql = "with paginacao as "
                    + "( "
                    + "select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "id_moeda,nom_moeda,sigla,cotacao,data_cotacao "
                    + "from moeda ";
        } else if (cTabela.equals("Suc")) {
            cSql = "with paginacao as "
                    + "( "
                    + "select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "id_suc,cod_suc,dsc_suc,tip_ocupado "
                    + "from suc ";
        } else if (cTabela.equals("SucMovimento")) {
            cSql = "with paginacao as "
                    + "( "
                    + "select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "suc_movimento.id_movimento,suc_movimento.id_suc,suc_movimento.id_cliente,suc_movimento.dat_movimento,suc_movimento.dsc_historico "
                    + "from suc_movimento, suc, cliente "
                    + "where suc_movimento.id_suc = suc.id_suc and suc_movimento.id_cliente = cliente.id_cliente ";
        } else if (cTabela.equals("CepUf")) {
            cSql = "with paginacao as "
                    + "( select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "cep_uf.cod_uf,cep_uf.dsc_estado "
                    + "from cep_uf ";
        } else if (cTabela.equals("CepCidade")) {
            cSql = "with paginacao as "
                    + "( select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "cep_cidade.cod_cidade,cep_cidade.cep,cep_cidade.dsc_cidade,cep_uf.cod_uf,cep_uf.dsc_estado "
                    + "from cep_cidade , cep_uf "
                    + "WHERE cep_cidade.cod_uf = cep_uf.cod_uf ";
        } else if (cTabela.equals("CodigoDdi")) {
            cSql = "with paginacao as "
                    + "( select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "id_ddi,ddi,descricao "
                    + "FROM codigo_ddi ";
        } else if (cTabela.equals("Cliente")) {
            cSql = "with paginacao as "
                    + "( select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "cliente.id_cliente,cliente.tip_cliente,cliente.nom_cliente,cliente.nom_proprietario,cliente.num_cpf, "
                    + "cliente.dat_nasc_abert,cliente.dsc_email,cliente.dsc_site,cliente.dsc_obs,cliente.dsc_historico,cliente.id_nacionalidade, "
                    + "cliente.tip_civil,cliente.tip_sexo,cliente.id_procurador,cliente.qde_acao,cliente.perc_partic,cliente.num_folha, "
                    + "cliente.id_livro,cliente.dat_saldo_anterior,cliente.saldo_anterior,cliente.id_anotacao_saldo_inicial,cliente.id_anotacao_saldo_atual, "
                    + "cliente.num_folha_atual,cliente.dsc_profissao,cliente.cod_logradouro,cliente.dsc_complemento,cliente.num_endereco, "
                    + "cliente.num_outro,cliente.num_telefone, cliente.impresso "
                    + "from cliente left join nacionalidade on cliente.id_nacionalidade = nacionalidade.id_nacionalidade "
                    + " left join livro on cliente.id_livro = livro.id_livro "
                    + " left join cep_endereco on cliente.cod_logradouro = cep_endereco.cod_logradouro ";
        } else if (cTabela.equals("ClienteEndereco")) {
            cSql = "with paginacao as "
                    + "( select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "id_endereco,tip_endereco,dsc_endereco,cod_logradouro, "
                    + "dsc_complemento,num_endereco,id_cliente, tip_principal "
                    + "FROM cliente_endereco ";
        } else if (cTabela.equals("ClienteEnderecoTelefone")) {
            cSql = "with paginacao as "
                    + "( select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "id_telefone,id_endereco,tip_telefone, id_ddi,id_ddd,dsc_telefone,"
                    + "num_telefone,num_ramal,id_departamento,nom_contato "
                    + "FROM cliente_endereco_telefone ";
        } else if (cTabela.equals("Departamento")) {
            cSql = "with paginacao as "
                    + "( select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "id_departamento,dsc_departamento "
                    + "FROM departamento ";
        } else if (cTabela.equals("TipoTransferencia")) {
            cSql = "with paginacao as "
                    + "( select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "id_tipo,dsc_tipo "
                    + "FROM Tipo_Transferencia ";
        } else if (cTabela.equals("Nacionalidade")) {
            cSql = "with paginacao as "
                    + "( select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "id_nacionalidade,dsc_nacionalidade "
                    + "FROM nacionalidade ";
        } else if (cTabela.equals("Procurador")) {
            cSql = "with paginacao as "
                    + "( select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "procurador.id_procurador,procurador.nom_procurador,procurador.nom_contato,procurador.dsc_email_procurador, "
                    + "procurador.num_telefone1,procurador.tip_telefone1,procurador.num_telefone2,procurador.tip_telefone2, "
                    + "procurador.num_telefone3,procurador.tip_telefone3 "
                    + "FROM procurador ";
        } else if (cTabela.equals("Livro")) {
            cSql = "with paginacao as "
                    + "( select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "id_livro,dat_abertura,dat_fechamento,num_folha_final,num_folha_inic,num_livro "
                    + "FROM livro ";
        } else if (cTabela.equals("Cautela")) {
            cSql = "with paginacao as "
                    + "( select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "cautela.id_cautela,cautela.dat_cautela,cautela.num_cautela,cautela_acionista.qde_receb as qde_total,cautela.vlr_unit, "
                    + "cautela.id_anotacao,cautela.id_cliente,cautela.id_livro,cautela.id_tipo, "
                    + "cautela.num_transferencia, cautela.impresso, cautela.num_certificado, cautela.qde_acao "
                    + "FROM Cautela , cliente, cautela_acionista , anotacao "
                    + "where cautela.id_cautela = cautela_acionista.id_Cautela and cautela_acionista.id_cliente = cliente.id_cliente "
                    + " and cautela.id_anotacao = anotacao.id_anotacao ";
        } else if (cTabela.equals("CautelaAcionista")) {
            cSql = "with paginacao as "
                    + "( select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "Cautela_acionista.id_Cautela_acionista, Cautela_acionista.qde_acao, Cautela_acionista.id_anotacao, Cautela_acionista.id_Cautela, Cautela_acionista.id_cliente,"
                    + "Cautela_acionista.num_transferencia, Cautela_acionista.dat_cautela, Cautela_acionista.id_livro, Cautela_acionista.num_cautela, Cautela_acionista.qde_proposta,"
                    + "Cautela_acionista.qde_receb, Cautela_acionista.impresso, Cautela_acionista.id_cedente, Cautela_acionista.num_certificado, Cautela_acionista.perc_partic "
                    + "FROM Cautela_acionista ";
            
        } else if (cTabela.equals("EditalCautela")) {
            cSql = "with paginacao as "
                    + "( select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "id_cautela,dat_cautela,num_cautela,id_livro,qde_total,vlr_unit,id_cliente,id_tipo "
                    + "FROM Edital_Cautela ";
        } else if (cTabela.equals("EditalCautelaAcionista")) {
            cSql = "with paginacao as "
                    + "( select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "id_Cautela_acionista,qde_acao,id_Cautela,id_cliente "
                    + "FROM Edital_Cautela_acionista ";
        } else if (cTabela.equals("Anotacao")) {
            cSql = "with paginacao as "
                    + "( select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "id_anotacao,dsc_anotacao "
                    + "FROM anotacao ";
        } else if (cTabela.equals("Subscricao")) {
            cSql = "with paginacao as "
                    + "( select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "id_subscricao,dat_subscricao,qde_subscrita,vlr_realizado,vlr_realizar,id_anotacao,id_cliente,id_livro "
                    + "FROM subscricao ";
        } else if (cTabela.equals("Averbacao")) {
            cSql = "with paginacao as "
                    + "( select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "id_averbacao,dat_averbacao,qde_alienacao,qde_judicial,qde_penhor,qde_portador,id_anotacao,id_cliente, id_livro "
                    + "FROM averbacao ";
        } else if (cTabela.equals("Empresa")) {
            cSql = "with paginacao as "
                    + "( select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "id_empresa,nom_empresa,qde_total, num_transferencia, num_certificado "
                    + "FROM empresa ";
        } else if (cTabela.equals("Usuario")) {
            cSql = "with paginacao as "
                    + "( select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "id_usuario,dsc_email,dsc_pergunta,dsc_resposta,dsc_thema,nom_usuario,usr_name,usr_password, "
                    + "tip_status, tip_usuario "
                    + "FROM usuario ";
        } else if (cTabela.equals("Modulo")) {
            cSql = "with paginacao as "
                    + "( select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "id_modulo,dsc_modulo,dsc_pagina,num_nivel "
                    + "FROM modulo ";
        } else if (cTabela.equals("UsuarioModulo")) {
            cSql = "with paginacao as "
                    + "( select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "id_modulo,id_usuario "
                    + "FROM usuario_modulo ";
        } else if (cTabela.equals("RelatorioCertificado")) {
            cSql = "with paginacao as "
                    + "( select row_number() over (order by par1 par2 ) as 'rownumber', "
                    + "id_cautela,id_cliente,qde_acao,dat_cautela,nom_cliente,num_transferencia,impresso "
                    + "FROM relatorio_certificado ";
        }

        return cSql;
    }

    private String retornaOrder(String cTabela) {
        String cOrder = null;

        if (cTabela.equals("CepEndereco")) {
            cOrder = "num_cep";
        } else if (cTabela.equals("CodigoDdd")) {
            cOrder = "codigo";
        } else if (cTabela.equals("Usuario")) {
            cOrder = "nom_usuario";
        } else if (cTabela.equals("CepBairro")) {
            cOrder = "dsc_bairro";
        } else if (cTabela.equals("Moeda")) {
            cOrder = "nom_Moeda";
        } else if (cTabela.equals("Suc")) {
            cOrder = "cod_suc";
        } else if (cTabela.equals("SucMovimento")) {
            cOrder = "Suc_Movimento.id_cliente, Suc_Movimento.dat_movimento";
        } else if (cTabela.equals("CepUf")) {
            cOrder = "cod_uf";
        } else if (cTabela.equals("CepCidade")) {
            cOrder = "dsc_cidade";
        } else if (cTabela.equals("CodigoDdi")) {
            cOrder = "descricao ";
        } else if (cTabela.equals("Cliente")) {
            cOrder = "tip_Cliente, nom_Cliente";
        } else if (cTabela.equals("ClienteEndereco")) {
            cOrder = "tip_Endereco, dsc_endereco";
        } else if (cTabela.equals("ClienteEnderecoTelefone")) {
            cOrder = "tip_telefone, dsc_telefone";
        } else if (cTabela.equals("Departamento")) {
            cOrder = "dsc_departamento";
        } else if (cTabela.equals("TipoTransferencia")) {
            cOrder = "dsc_tipo";
        } else if (cTabela.equals("Nacionalidade")) {
            cOrder = "dsc_nacionalidade";
        } else if (cTabela.equals("Procurador")) {
            cOrder = "nom_procurador";
        } else if (cTabela.equals("Livro")) {
            cOrder = "dat_fechamento";
        } else if (cTabela.equals("Cautela")) {
            cOrder = "cautela.dat_cautela";
        } else if (cTabela.equals("CautelaAcionista")) {
            cOrder = "Cautela_Acionista.id_cliente";
        } else if (cTabela.equals("EditalCautela")) {
            cOrder = "dat_cautela";
        } else if (cTabela.equals("EditalCautelaAcionista")) {
            cOrder = "id_cliente";
        } else if (cTabela.equals("Anotacao")) {
            cOrder = "id_anotacao";
        } else if (cTabela.equals("Subscricao")) {
            cOrder = "dat_subscricao";
        } else if (cTabela.equals("Averbacao")) {
            cOrder = "dat_averbacao";
        } else if (cTabela.equals("Empresa")) {
            cOrder = "nom_empresa";
        } else if (cTabela.equals("Modulo")) {
            cOrder = "num_nivel";
        } else if (cTabela.equals("UsuarioModulo")) {
            cOrder = "id_usuario";
        } else if (cTabela.equals("RelatorioCertificado")) {
            cOrder = "nom_Cliente";
        }

        return cOrder;
    }
}
